package com.nuo.laboratory.SPI;

import com.nuo.laboratory.SPI.Dubbo.IBusinessService;
import com.nuo.laboratory.SPI.JDK.ISearch;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.junit.Test;
import sun.applet.AppletClassLoader;
import sun.misc.Launcher;

import java.util.List;
import java.util.ServiceLoader;

/**
 * SPI全称Service Provider Interface，是Java提供的一套用来被第三方实现或者扩展的API
 *
 * @author LGC
 * @date 2022/4/13 9:27
 */
public class SPITest {

    /**
     * JDK标准的SPI会一次性实例化扩展点所有实现(遍历所有实现并实例化)，如果有扩展实现初始化很耗时，但如果没用上也加载，会很浪费资源。
     * 不能按需加载
     */
    @Test
    public void jdk() {
        ServiceLoader<ISearch> load = ServiceLoader.load(ISearch.class);
        for (ISearch next : load) {
            List<String> search = next.search();
            System.out.println(search);
        }
    }

    /**
     * Dubbo SPI只是加载配置文件中的类，并分成不同的种类缓存在内存中，不会立即全部初始化
     * Dubbo SPI在扩展加载失败的时候会先抛出真实异常并打印日志
     */
    @Test
    public void dubbo() {
        // 加载扩展点
        ExtensionLoader<IBusinessService> extensionLoader = ExtensionLoader.getExtensionLoader(IBusinessService.class);
        // 获取默认扩展点,并执行
        IBusinessService defaultExtension = extensionLoader.getDefaultExtension();
        defaultExtension.doSomething("zhangsan");

        // 获取b扩展点，并执行
        IBusinessService bExtension = extensionLoader.getExtension("b");
        bExtension.doSomething("lisi");
    }

















    @Test
    public void aa(){
        System.out.println(System.getProperty("sun.boot.class.path"));
        System.out.println(System.getProperty("java.ext.dirs"));

        System.out.println(System.getProperty("java.class.path"));

//        AppletClassLoader

    }
}
